package reporte.filtros;

import java.util.ArrayList;
import java.util.List;

/**
 * Filtro abstracto de colecciones
 * @author Octavio Nicolas Pompilio
 * @param <T>
 * El tipo de elemento que se filtrara
 */
public abstract class Filtro<T> {
	/**
	 * Aplica el filtro a toda la coleccion.
	 * @param coleccion
	 * La coleccion sobre la que se aplica el filtro.
	 * @return
	 * Una coleccion filtrada.
	 */
	public List<T> filtrar(List<T> coleccion){
		List<T> listaT = new ArrayList<T>();
		
		for( T elemento:coleccion ){
			if( this.filtro(elemento) )
				listaT.add(elemento);
		}
		
		return listaT;		
	}

	/**
	 * El criterio del filtro
	 * @param elemento
	 * Es elemento al cual se quiere filtrar.
	 * @return
	 * Si hay que filtrarlo o no.
	 */
	protected abstract boolean filtro(T elemento);
}
